package cumt.oj;

/**
 * @Author Fizz Pu
 * @Date 2020/11/17 下午1:34
 * @Version 1.0
 * 失之毫厘，缪之千里！
 */

/**
 * 题目描述
 * 三个法师康的工人每天早上6点到工厂开始到三条产品生产线上组装桔子手机。第一个工人在200时刻开始（从6点开始计时，以秒作为单位）在生产线上开始生产，一直到1000时刻。第二个工人，在700时刻开始，在1100时刻结束。第三个工人从1500时刻工作到2100时刻。期间最长至少有一个工人在生产线上工作的连续时间为900秒（从200时刻到1100时刻），而最长的无人生产的连续时间（从生产开始到生产结束）为400时刻（1100时刻到1500时刻）。
 *
 * 你的任务是用一个程序衡量N个工人在N条产品线上的工作时间列表（1≤N≤5000，以秒为单位）。
 *
 * ·最长的至少有一个工人在工作的时间段
 *
 * ·最长的无人工作的时间段（从有人工作开始计）
 *
 * 输入
 * 输入第1行为一个整数N，第2-N+1行每行包括两个均小于1000000的非负整数数据，表示其中一个工人的生产开始时间与结束时间。
 *
 * 输出
 * 输出为一行，用空格分隔开两个我们所求的数。
 *
 * 样例输入
 * 3
 * 200 1000   800
 * 700 1100   1100 - 200 = 900
 * 300 1200    1200 - 200
 * 1500 2100 1500 - 1200
 * 样例输出
 * 900 400
 */

// 解决第一个问题
// 开始时间排序
// 200 开始
// 700 第二个开始的时间 <= 第一个结束的时间 则取结束结束时间的最大值
// 1. 排序, 找一个比1000小的开始时间, 最后取个最大值
// 2. 找一个

// 2. 做一个减法 1500 - 2100

// 此题不是难, 但是代码很难组织

import java.util.Arrays;
import java.util.Scanner;

/**
 * 200 1000
 * 700 1100   == > 200 - 1100  无人工作 1500 - 110 = 400
 *
 * 1500 2100 == > 2900 - 1500 无人工作 0
 * 1600 2900
 *
  */

class Pair implements   Comparable<Pair>{
    int start;
    int end;

    @Override
    public int compareTo(Pair o) {
        return this.start - o.start; // 按照开始时间升序排序
    }

    public Pair(int start, int end)  {
        this.start = start;
        this.end = end;
    }
}

public class Worker2_1 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();
        Pair[] pairs = new Pair[N];
        for(int i = 0; i < N; ++i){
            pairs[i] = new Pair(scanner.nextInt(), scanner.nextInt());
        }

        // 升序
        Arrays.sort(pairs);

        int start = pairs[0].start, end = pairs[0].end;
        int ans1 = end - start, ans2 = 0;
        for(int i = 1; i < pairs.length; ++i){
            Pair curPair = pairs[i];

            // 刚好可以连起来
            if(curPair.start <= end) {
                end = Math.max(end, curPair.end);
                ans1 = end - start;
            }

            // 连不起来, 就要更新起点
            else {
                ans2 = Math.max(ans2, curPair.start - end);
                start = curPair.start;
                end = curPair.end;
            }
        }

        System.out.print(ans1 + " " + ans2);
    }
}
